﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Security.AccessControl;
using System.Security.Principal;

namespace minimizarCodigoFuente
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //selecciono el Directorio de origen
            FolderBrowserDialog folderBrowserDialog1 = new FolderBrowserDialog();

            if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)
            {
                //--- guardo el nombre del directorio de origen
                this.tb_rutaOrigen.Text = folderBrowserDialog1.SelectedPath;

                //--- obtengo todos los archivos del directorio
                string[] filePaths =Directory.GetFiles(folderBrowserDialog1.SelectedPath, "*.*", SearchOption.AllDirectories);

                //--- procedo a crear el nuevo directorio en base al que se encontro
                this.tb_rutaDestino.Text = folderBrowserDialog1.SelectedPath + "(minimizado)";
                if (!Directory.Exists(this.tb_rutaDestino.Text))
                {
                    Directory.CreateDirectory(this.tb_rutaDestino.Text);
                }
                else
                {
                    if (MessageBox.Show("¿Desea reemplazar la carpeta existente?", "", MessageBoxButtons.YesNo) == DialogResult.Yes)
                    {
                        Directory.Delete(this.tb_rutaDestino.Text, true);
                        Directory.CreateDirectory(this.tb_rutaDestino.Text);
                    }
                    else
                    {
                        //MessageBox.Show("Debe eliminar la carpeta destino para continuar.");
                        return;
                    }
                }
                
                //--- obtengo las extensiones que seran omitidas de la copia
                string[] extensions = this.tb_extensiones.Text.Replace(" ","").Split(',');
                //--- obtengo los archivos que seran minimizados
                string[] minimizar = this.tb_minimizar.Text.Replace(" ", "").Split(',');
                //--- obtengo los archivos que NO PUEDEN MINIMIZARSE
                string[] excepciones = this.tb_excepciones.Text.Replace(" ", "").Split(',');

                progressBar1.Value = 0;
                progressBar1.Maximum = filePaths.Length;


                //--- recorro los archivos del directorio destino y los copio uno a uno en el nuevo directorio

                this.tb_archivosProcesados.Text = string.Empty;
                string temFile = "";
                bool procesar = false;
                //int aux = 0;

                Cursor.Current = Cursors.WaitCursor;
                foreach(string file in filePaths)
                {
                    /*
                    aux++;
                    if (aux % 10 ==0)
                    {
                        this.progressBar1.Value = aux;
                    }*/
                    progressBar1.PerformStep();
                    
                    //--- Verifico si es un archivo del versionamiento
                    if (file.Contains("\\.svn\\"))
                    {
                        procesar = false;
                    }
                    else if (this.cb_copiarOcultos.Checked)
                    {
                        procesar = true;
                    }
                    else if ((File.GetAttributes(file) & FileAttributes.Hidden) != FileAttributes.Hidden)
                    {
                        procesar = true;
                    }
                    else 
                    {
                        procesar = false;
                    }

                    if (procesar)
                    {
                        temFile = file.Replace(this.tb_rutaOrigen.Text, this.tb_rutaDestino.Text);
                        //--- si la extension no esta excluida, la ejecuto
                        //MessageBox.Show(Path.GetExtension(file).Replace(".", ""));
                        if (!extensions.Contains(Path.GetExtension(file).Replace(".","")))
                        {
                            if (!Directory.Exists(Path.GetDirectoryName(temFile)))
                            {
                                Directory.CreateDirectory(Path.GetDirectoryName(temFile));
                            }

                            //--- imprimo los archivos encontrados en pantalla
                            this.tb_archivosProcesados.Text = this.tb_archivosProcesados.Text + temFile + "\r\n";
                            //--- en esta sentencia verifico que archivos sera minizados
                            if (minimizar.Contains(Path.GetExtension(file).Replace(".", "")) && !excepciones.Contains(Path.GetFileName(file)) && !file.Contains("\\mpdf\\")){
                                //--- minimizo y copio el archivo
                                this.minimizarYCopiar(file,temFile);         
                            }else{
                                //--- copio el archivo
                                File.Copy(file, temFile, true);
                            }
                        }
                    }
                }

                //-- le doy todos los permisos a la nueva carpeta
                this.grantAccess(this.tb_rutaDestino.Text);

                Cursor.Current = Cursors.Default;

                //MessageBox.Show("Directorio copiado con exito.");

                System.Diagnostics.Process.Start(this.tb_rutaDestino.Text);
            }
        }

            
        public bool minimizarYCopiar(string fileOrigen,string fileDestino){
                try
                {   
                    using (Stream myStream = File.OpenRead(fileOrigen))
                    {
                        string caracterComentario = "//";
                        string txtFile = "";
                        string txtLine = "";

                       // if (fileOrigen.Contains("custom.js"))
                       // {
                        //    MessageBox.Show("...");
                        //}

                        StreamReader reader = new StreamReader(myStream);
                        while (!reader.EndOfStream)
                        {
                            txtLine=reader.ReadLine();
                            if (
                                txtLine.Contains(caracterComentario) 
                                && !txtLine.Contains("=\""+caracterComentario) 
                                && !txtLine.Contains("='"+caracterComentario)
                                && !txtLine.Contains("=\"http:" + caracterComentario)
                                && !txtLine.Contains("='http:" + caracterComentario)
                                )
                            {
                                txtLine=txtLine.Remove(txtLine.IndexOf(caracterComentario));                                
                            }
                            txtLine = txtLine.Trim();
                            if (Path.GetExtension(fileOrigen) == ".js" && txtLine.Contains("$("))
                            {
                                txtLine = txtLine.Replace("$(", "\r\n$(");
                            }
                            txtFile = txtFile + (!txtLine.Equals(string.Empty) ?  " " + txtLine : "" );
                        }
                        //-- cierro el stream
                        reader.Close();
                        //--- copio el texto en el nuevo archivo
                        System.IO.File.WriteAllText(fileDestino,txtFile.Trim());
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show("No fue posible abrir el archivo.\n\n" + ex.Message);
                    return false;
                }
               
                return true;
           }

        private bool grantAccess(string fullPath)
        {
            DirectoryInfo dInfo = new DirectoryInfo(fullPath);
            DirectorySecurity dSecurity = dInfo.GetAccessControl();
            dSecurity.AddAccessRule(new FileSystemAccessRule(new SecurityIdentifier(WellKnownSidType.WorldSid, null), FileSystemRights.FullControl, InheritanceFlags.ObjectInherit | InheritanceFlags.ContainerInherit, PropagationFlags.NoPropagateInherit, AccessControlType.Allow));
            dInfo.SetAccessControl(dSecurity);
            return true;
        }

    }
}
